import qn from 'qn';
import { QINIU_ACCESS_KEY, QINIU_SECRET_KEY, QINIU_BUCKET, QINIU_CDN_DOMAIN } from '../config';
import http from 'http';
import https from 'https';
import uuid from 'uuid';

// qiniu上传设置
const client = qn.create({
  accessKey: QINIU_ACCESS_KEY,
  secretKey: QINIU_SECRET_KEY,
  bucket: QINIU_BUCKET,
  origin: QINIU_CDN_DOMAIN
});

export function qiniuUpload(buffer, key) {
  return new Promise((resolve, reject) => {
    client.upload(buffer, { key }, function (err, result) {
      if (err) {
        console.log(err);
        reject(err);
        return;
      }
      resolve(result.url);
    });
  });
}

// 将网络图片转成七牛云上的图片
export function qiniuUploadByImgUrl(img, httpType = 'http') {
  if (!img) return null;
  return new Promise((resolve, reject) => {
    const request = httpType === 'http' ? http : https;
    request.get(img, imgRes => {
      let chunks = []; // 用于保存网络请求不断加载传输的缓冲数据
      let size = 0; // 保存缓冲数据的总长度
      imgRes.on('data', chunk => {
        /**
         * 在进行网络请求时，会不断接收到数据(数据不是一次性获取到的)
         * node会把接收到的数据片段逐段的保存在缓冲区（Buffer）
         * 这些数据片段会形成一个个缓冲对象（即Buffer对象）
         * 而Buffer数据的拼接并不能像字符串那样拼接（因为一个中文字符占三个字节），
         * 如果一个数据片段携带着一个中文的两个字节，下一个数据片段携带着最后一个字节，
         * 直接字符串拼接会导致乱码，为避免乱码，所以将得到缓冲数据推入到chunks数组中，
         * 利用下面的node.js内置的Buffer.concat()方法进行拼接
         */
        chunks.push(chunk);
        size += chunk.length;
      });
      imgRes.on('end', err => {
        if (err) {
          reject('下载书籍封面图片失败');
          return;
        }
        const buffer = Buffer.concat(chunks, size);
        // 判断是否是一个buffer对象
        if (Buffer.isBuffer(buffer)) {
          qiniuUpload(buffer, 'mbook/' + uuid.v1() + '.png')
            .then(res => {
              resolve(res);
            })
            .catch(err => {
              reject('生成图片失败，' + err.toString());
            });
        } else {
          reject('生成图片失败，不是Buffer');
        }
      });
    });
  });
}
